package miniAES;

public class decCry {
    private decCry(){}
    //private static byte[] mixInColumnOutput=new byte [4];
    //一轮的解密
    public static byte[] oneDec(byte[] input,byte[] subKey){
        byte[] mixInColumnOutput =new byte[4];
                //密钥加
        input=assembly.keyAddition(input,subKey);
        //列混淆的逆
        mixInColumnOutput=assembly.mixColumn(input,mixInColumnOutput);
        //行移位的逆
        input=assembly.shiftRow(mixInColumnOutput);
        //S盒的逆
        input=assembly.nibbleInSub(input);
        return input;
    }
    //第一轮的解密，没有列混淆的那个
    public static byte[] noMixColumnDec(byte[] input,byte[] subKey){
        //密钥加
        input=assembly.keyAddition(input,subKey);
        //行移位的逆
        input=assembly.shiftRow(input);
        //S盒的逆
        input=assembly.nibbleInSub(input);

        return input;
    }
    //r轮的解密操作 round表示密钥的个数
    public static byte[] decRround(byte[] input, byte[][] subKey,int round){
        //第一轮的解密
        input=noMixColumnDec(input,subKey[round-1]);
        //assembly.printBin(input);
        //后r-1轮得解密操作
        for (int i =round-2; i >=1 ; i--) {
            input=oneDec(input,subKey[i]);
            //assembly.printBin(input);
        }
        //白化密钥加
        input=assembly.keyAddition(input,subKey[0]);
        return input;
    }


}
